<?php
namespace app\job;

use app\common\model\Order;
use app\common\model\PrizeDraw;
use think\Log;
use think\queue\Job;

/**
 * 自动放弃领奖
 * Class AutoGiveUp
 * @package app\job
 */
class AutoGiveUp{

    public function fire(Job $job, $data){

        //....这里执行具体的任务
        // 有些消息在到达消费者时,可能已经不再需要执行了
        $isJobStillNeedToBeDone = $this->checkToBeDone($data);
        if(!$isJobStillNeedToBeDone){
            $job->delete();
            return;
        }

        $isJobDone = $this->doJob($data);

        if ($isJobDone) {
            // 如果任务执行成功， 记得删除任务
            $job->delete();
        }else{
            if ($job->attempts() > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了
                $job->delete();
            }
        }

    }

    public function failed($data){

        // ...任务达到最大重试次数后，失败了
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function checkToBeDone($data){

        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理...
     */
    private function doJob($data)
    {
        //prize_draw status 等于 0 弃奖 否则 不执行
        //prize_draw 修改 status = 2

        $prizeDrawModel = new PrizeDraw();
        $order = new Order();
        $map = [
            'id'     => ['in',$data],
            'status' => 0
        ];
        $prizeList = $prizeDrawModel->where($map)->select();

        //if为空则不继续执行
        if (!$prizeList) {
            $msg = '无需自动放弃奖';
            LOG::myLog($msg,$data,'job');
            return true;
        }

        $order_sn_list = array_column($prizeList,'order_sn');

        //修改prize_draw 状态=弃奖
        $prizeDrawModel->save([
            'status' => 2
        ],$map);

        $map2 = [
            'order_sn' => ['in',$order_sn_list],
        ];
        //修改order 状态取消，和过期时间
        $order->save([
            'state' => 3,
            'expiretime' => time(), //订单过期
        ],$map2);

        $msg = '自动弃奖';
        LOG::myLog($msg,$data,'job');
        return true;
    }

}